package com.jml.spring.a;

/**
 * 懒汉式--双重检查
 */
public class Student懒 {

    private volatile static  Student懒 s = null;

    private Student懒(){
    }


    //锁不能加在方法上粒度太大了，因为即使已经创建了，之后获取对象也要排队，但是，是不需要排队的只需要直接使用即可
    public static synchronized Student懒 getSingletonInstance1(){
        return s = new Student懒();
    }


    public static Student懒 getSingletonInstance(){
        if(s == null){
            synchronized (Student懒.class) {
                //if一定要有，否则其他线程获取锁后又重复创建了
                if (s == null) {
                    //这一行代码包含三个步骤，new 申请空间，
                    //初始化字段属性
                    // 把内存的地址给到s
                    //这三个顺序是随机的，不一定是有序的，可能先给了地址，但是还没有初始化属性，
                    // 就会导致其他人可以获取到这个不完整的对象，有可能导致空指针异常
                    s = new Student懒();
                }
            }
        }
        return s;
    }
}
